package config

import (
	"flag"
	"fmt"
	"os"
	"path/filepath"

	"gopkg.in/yaml.v3"
)

// Config 表示应用程序配置
type Config struct {
	Server    ServerConfig    `yaml:"server"`
	Database  DatabaseConfig  `yaml:"database"`
	Embedding EmbeddingConfig `yaml:"embedding"`
	Web       WebConfig       `yaml:"web"`
}

// ServerConfig 表示服务器配置
type ServerConfig struct {
	Host  string `yaml:"host"`
	Port  int    `yaml:"port"`
	Debug bool   `yaml:"debug"`
	CORS  bool   `yaml:"cors"`
}

// DatabaseConfig 表示数据库配置
type DatabaseConfig struct {
	MemoryMode       bool   `yaml:"memory_mode"`
	SingleDBPath     string `yaml:"single_db_path"`
	CollectionsDir   string `yaml:"collections_dir"`
	UseCollections   bool   `yaml:"use_collections"`
	AutoSaveInterval int    `yaml:"auto_save_interval"`
}

// EmbeddingConfig 表示嵌入服务配置
type EmbeddingConfig struct {
	Provider string       `yaml:"provider"`
	Ollama   OllamaConfig `yaml:"ollama"`
}

// OllamaConfig 表示Ollama嵌入服务配置
type OllamaConfig struct {
	Host  string `yaml:"host"`
	Port  int    `yaml:"port"`
	Model string `yaml:"model"`
}

// WebConfig 表示Web界面配置
type WebConfig struct {
	ServeStatic  bool   `yaml:"serve_static"`
	StaticDir    string `yaml:"static_dir"`
	RedirectRoot bool   `yaml:"redirect_root"`
}

// 定义命令行参数
var (
	configPath = flag.String("config", "config.yaml", "配置文件路径")
)

// LoadConfig 从文件加载配置
func LoadConfig() (*Config, error) {
	flag.Parse()

	// 检查配置文件路径
	if _, err := os.Stat(*configPath); os.IsNotExist(err) {
		return nil, fmt.Errorf("配置文件不存在: %s", *configPath)
	}

	// 读取配置文件
	data, err := os.ReadFile(*configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	// 解析YAML
	var cfg Config
	if err := yaml.Unmarshal(data, &cfg); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	// 规范化路径
	if cfg.Database.CollectionsDir != "" && !filepath.IsAbs(cfg.Database.CollectionsDir) {
		cfg.Database.CollectionsDir = filepath.Join(".", cfg.Database.CollectionsDir)
	}
	if cfg.Database.SingleDBPath != "" && !filepath.IsAbs(cfg.Database.SingleDBPath) {
		cfg.Database.SingleDBPath = filepath.Join(".", cfg.Database.SingleDBPath)
	}
	if cfg.Web.StaticDir != "" && !filepath.IsAbs(cfg.Web.StaticDir) {
		cfg.Web.StaticDir = filepath.Join(".", cfg.Web.StaticDir)
	}

	return &cfg, nil
}

// SaveConfig 将配置保存到文件
func SaveConfig(cfg *Config, path string) error {
	// 序列化为YAML
	data, err := yaml.Marshal(cfg)
	if err != nil {
		return fmt.Errorf("序列化配置失败: %w", err)
	}

	// 写入文件
	if err := os.WriteFile(path, data, 0644); err != nil {
		return fmt.Errorf("保存配置文件失败: %w", err)
	}

	return nil
}

// DefaultConfig 返回默认配置
func DefaultConfig() *Config {
	return &Config{
		Server: ServerConfig{
			Host:  "localhost",
			Port:  8088,
			Debug: false,
			CORS:  true,
		},
		Database: DatabaseConfig{
			MemoryMode:       false,
			SingleDBPath:     "vectordb.sqlite",
			CollectionsDir:   "collections",
			UseCollections:   true,
			AutoSaveInterval: 300,
		},
		Embedding: EmbeddingConfig{
			Provider: "ollama",
			Ollama: OllamaConfig{
				Host:  "localhost",
				Port:  11434,
				Model: "bge-m3",
			},
		},
		Web: WebConfig{
			ServeStatic:  true,
			StaticDir:    "./web",
			RedirectRoot: true,
		},
	}
}
